﻿using DAO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using WebApplication.Core;

namespace WebApplication.Models
{
    public class ReportSettingsModel
    {
        private Report _report;
        private string _reportPath;
        private List<ReportParameter> _parameters;
        public ReportSettingsModel(Report report)
        {
            _report = report;
            _parameters = new List<ReportParameter>();
            InitializeReportSettings(report.XmlSettings);
        }

        public int IdReport
        {
            get
            {
                return _report.id;
            }
        }

        public string ReportName 
        {
            get
            {
                return _report.Name;
            }
        }

        public string ReportPath
        {
            get
            {
                return _reportPath;
            }
        }

        public IEnumerable<ReportParameter> ReportParameters
        {
            get
            {
                return _parameters;
            }
        }

        private void InitializeReportSettings(string xml)
        {
            XmlDocument document = new XmlDocument();
            document.LoadXml(xml);

            _reportPath = document.GetElementsByTagName("reportFile")[0].Attributes["path"].Value;
            if (string.IsNullOrEmpty(_reportPath))
                throw new InvalidOperationException("Название файла отчета не может быть пустым. Проверьте настройки отчета.");

            string parameterSettingName = string.Empty;
            string parameterName = string.Empty;
            EnumDataTypes parameterType = EnumDataTypes.Numeric;

            XmlNodeList parameters = document.GetElementsByTagName("parameter");
            for (int i = 0; i < parameters.Count; i++)
            {
                parameterName = "";

                if (parameters[i].Attributes["name"] == null)
                    throw new InvalidOperationException("Имя параметра не может быть пустым");
                parameterName = parameters[i].Attributes["name"].Value;

                if (parameters[i].Attributes["dataType"] == null)
                    throw new InvalidOperationException("Должен быть задан тип данных параметра");
                switch (parameters[i].Attributes["dataType"].Value)
                {
                    case "Numeric":
                        parameterType = EnumDataTypes.Numeric;
                        break;
                    case "Symbol":
                        parameterType = EnumDataTypes.Symbol;
                        break;
                    case "Date":
                        parameterType = EnumDataTypes.Date;
                        break;
                    case "Server":
                        parameterType = EnumDataTypes.Server;
                        break;
                    case "DeployObject":
                        parameterType = EnumDataTypes.DeployObject;
                        break;
                    default:
                        throw new InvalidOperationException("Неизвестное значение типа данных параметра");
                }
                
                if (parameters[i].Attributes["parameterName"] == null)
                    throw new InvalidOperationException("Имя поля не должно быть пустым");

                parameterSettingName = parameters[i].Attributes["parameterName"].Value;
                _parameters.Add(new ReportParameter
                    {
                        Name = parameterName,
                        DataType = parameterType,
                        ParameterSettingName = parameterSettingName
                    });
            }
        }

    }
}